7 提升方法

参考这篇笔记了解 bagging&boosting 的基本概念. 在分类问题中, boosting 可以改变训练样本的权重, 学习多个分类器, 将他们进行线性组合.

1 AdaBoost 算法

1.1 基本思路

在满足 PAC 可学习性时, 我们可以定义

事实上可以证明, 强可学习和弱可学习等价, 因此我们需要把弱可学习 boost 为强可学习. 对于分类问题, 我们可以先学习一系列弱学习算法, 然后组合它们, 构成一个强分类器. AdaBoost 会每轮提高前一轮误分类样本的权值, 采取加权多数表决的方法.

1.2 AdaBoost 算法

依然假设训练集形如 T={(x1,y1),⋯,(xN,yN)}, 其中 xi∈X⊂Rn,yi∈Y={−1,+1}.

AdaBoost 算法

输入 T; 弱学习算法.
输出 最终分类器 G(x).

  1. 初始化权值分布 D1: D1=(ω11,⋯,ω1i,⋯,ω1N),ω1i=1N,i=1,⋯,N.
  2. 对于 m=1,⋯,M:
    1. 使用权值分布为 Dm 的训练集学习, 得到基本分类器 Gm(x):X→{−1,+1}.
    2. 计算 Gm(x) 的分类误差率 em=∑i=1NP(Gm(xi)≠yi)=∑i=1Nωmi1{Gm(xi)≠yi}.
    3. 计算 Gm(x) 的系数 αm=12log⁡1−emem.
    4. 更新权值分布 Dm+1=(ωm+1,1,⋯,ωm+1,i,⋯,ωm+1,N),ωm+1,i=1Zmωmiexp⁡(−αmyiGm(xi)),Zm=∑i=1Nωmiexp⁡(−αmyiGm(xi)).
  3. 得到最终分类器f(x)=∑m=1MαmGm(x),G(x)=sgn(f(x)).

2 训练误差分析

定理 2.1 (AdaBoost 训练误差边界)

(2.1)1N∑i=1N1{G(xi)≠yi}≤1N∑i=1Nexp⁡(−yif(xi))=∏m=1MZm.

定理 2.2 (二分类问题的训练误差边界)

(2.2)∏m=1MZm=∏m=1M[2em(1−em)]=∏m=1M1−4γm2≤exp⁡(−2∑m=1Mγm2).

其中 γm=12−em.

推论

如果 ∃γ>0,∀m:γm≥γ, 则 (2.4)1N∑i=1N1{G(xi)≠yi}≤exp⁡(−2Mγ2).

这说明 AdaBoost 的训练误差是指数级下降的.

3 算法解释

3.1 前向分步算法 (Forward Stagewise Algorithm)

训练集 T 同前. 考虑加法模型 (3.1)f(x)=∑m=1Mβmb(x;γm), 这里 b(x;γm) 为基函数, γm 为参数, βm 为系数. 给定训练数据和损失函数 L(y,f(x)), 只需要考虑最小化问题 minβm,γm∑i=1NL(yi,∑m=1Mβmb(xi;γm)).
这是一个复杂的优化问题. 但是前向分步算法希望每步只学习一个基函数, 简化优化复杂度. 也即, 每步优化 minβ,γ∑i=1NL(yi;βb(xi;γ)).

前向分步算法

输入 T, L(y,f(x)), {b(x;γ)}.
输出 加法模型 f(x).

  1. 初始化 f0(x)=0.
  2. 对 m=1,⋯,M:
    1. 极小化损失函数 (βm,γm)=arg⁡minβ,γ∑i=1ML(yi,fm−1(xi)+βb(xi;y)), 得到 βm,γm.
    2. 更新 fm(x)=fm−1(x)+βmb(x;γm).
  3. 得到加法模型 f(x)=fM(x)=∑m=1Mβmb(x;γm).

3.2 前向分步算法与 AdaBoost

下面的定理指出前向分步算法可以推出 AdaBoost.

定理 3.1

AdaBoost 算法是基本分类器组成的加法模型, 损失函数是指数函数, 因此是前向分步算法的特例.

4 提升树

基于分类树或者回归树基本分类器, 用前向分步算法得到的模型称为提升树 (Boosting Tree), 它是统计学习中性能最好的方法之一.

4.1 提升树模型

用 T(x;Θm) 表示决策树, Θm 为参数, M 为数的个数, 则提升树模型可以表示为 (4.1)fM(x)=∑m=1MT(x;Θm).

4.2 提升树算法

代入前向分步算法, 得到fm(x)=fm−1(x)+T(x;Θm),(4.2)Θ^m=arg⁡minΘm∑i=1NL(yi,fm−1(xi)+T(xi;Θm)).
对于二分类问题, 将 Gm(x) 限制为二分类树即可, 这就是 AdaBoost 算法的特殊情况. 接下来讨论回归问题的提升树.
现在对于 T, 需要更改 yi∈Y⊂R. 回顾回归树, 将 X 划分为 J 个不相交的区域 R1,⋯,RJ, 在每个区域上确定输出的常量 cj, 则 (4.3)T(x;Θ)=∑j=1Jcj1{x∈Rj}, 其中 Θ={(R1,c1),⋯,(RJ,cJ)}, J 就是树的叶节点个数.

如果采用平方误差损失函数 L(y,f(x))=(y−f(x))2, 则代入 (4.2) L(y,fm−1(x)+T(x;Θm))=[r−T(x;Θm)]2, 这里 r=y−fm−1(x) 是当前拟合数据的残差. 所以, T 的目标仅仅是拟合当前模型的残差.

回归问题的提升树算法

输入 T
输出 fM(x)

  1. 初始化 f0(x)=0.
  2. 对 m=1,⋯,M,
    1. 按 (4.3) 计算残差 rmi=yi−fm−1(xi),1≤i≤N.
    2. 拟合 rmi 学习回归树 T(x;Θm).
    3. 更新 fm(x)=fm−1(x)+T(x;Θm).
  3. 得到 fM(x)=∑m=1MT(x;Θm).

4.3 梯度提升

对于一般损失函数, 每一步的优化可能并非像平方损失函数那样容易. 因此, 可以使用梯度提升 (gradient boosting), 关键是利用损失函数的负梯度在当前模型的取值 −[∂L(y,f(xi))∂f(xi)]|f(x)=fm−1(x).

梯度提升算法

输入 T, L(y,f(x)).
输出 回归树 f^(x).

  1. 初始化 f0(x)=arg⁡minc∑i=1NL(yi,c).
  2. 对 m=1,⋯,M,
    1. 对 n=1,⋯,N, 计算 rmi=−[∂L(y,f(xi))∂f(xi)]|f(x)=fm−1(x).
    2. 对 rmi 拟合回归树, 得到第 m 棵树对叶结点区域为 Rmj,1≤j≤J.
    3. 对 j=1,⋯,J, 计算 cmj=arg⁡minc∑xi∈RmjL(yi,fm−1(xi)+c).
    4. 更新 fm(x)=fm−1(x)+∑j=1Jcmj1{x∈Rmj}.
  3. 得到回归树 f^(x)=fM(x)=∑m=1M∑j=1Jcmj1{x∈Rmj}.